package com.poem.springboot_rear.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Dict;
import com.poem.springboot_rear.common.AuthAccess;
import com.poem.springboot_rear.common.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * 功能： 文件的上传和下载
 * 作者： 小祝小祝
 * 日期： 2023/11/15 14:04
 */

@RestController
@RequestMapping("/file")
public class FileController {
    // 从配置文件中拿IP地址和端口号
    @Value("${ip:localhost}")
    String ip;

    @Value("${server.port}")
    String port;

    // 定义一个固定的全局固定存储父级目录
    //  G:\Mr_zhu\One\systempower-bank\files
    private static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";

    @AuthAccess
    @PostMapping("/upload")
    public Result upload(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename(); // 获取文件的原始名称
        // 假设一个文件名为 aaa.png
        String mainName = FileUtil.mainName(originalFilename);  // 拿到一个不包含后缀的名称  aaa
        String extName = FileUtil.extName(originalFilename);// 拿到后缀名    png
//        String projectPath = System.getProperty("user.dir"); // 拿到当前项目的路径 G:\Mr_zhu\One\systempower-bank
//        String filesPath = projectPath + "\\files"; // 文件的存储目录 G:\Mr_zhu\One\systempower-bank\files
//        File parentFile = new File(filesPath); // 存储目录
        File parentFile = new File(ROOT_PATH); // 存储目录
        // 判断文件父级目录是否存在，如果不存在就创建父级目录  .exist() 存在
        if (!FileUtil.exist(ROOT_PATH)){
            FileUtil.mkdir(ROOT_PATH);  // 创建父级目录
        }
        File saveFile = new File(ROOT_PATH +"//" + originalFilename);  // 文件的存储路径 G:\Mr_zhu\One\systempower-bank\files\aaa.png
        // 如果当前上传的文件名已经存在了，，那么这个时候重命名一个文件名称 exists 存在
        if (saveFile.exists()){
            // 新文件名称 =  随机数 + _ + 原始名称 + .原始后缀
            // G:\Mr_zhu\One\systempower-bank\files\21345456aaa.png
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
            // File.separator 文件分隔符
            saveFile = new File(ROOT_PATH + File.separator+ originalFilename); // 组装存储路径
        }
        file.transferTo(saveFile); // 存储文件到本地的磁盘里面去
        String url = "http://"+ ip + ":" + port + "/file/download/" + originalFilename;
        return Result.success(url); // 返回文件的链接，这个链接就是文件的下载地址，这个下载地址就是我的后台提供出来的
    }

    // @PathVariable 表示是一个路径参数
    @AuthAccess
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
        // URLEncoder.encode 给文件编码，UTF-8
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));  // 附件下载
        // File.separator 文件分隔符
        // 判断文件是否存在，如果不存在直接 return
        String filePath = ROOT_PATH + File.separator + fileName;
        if (!FileUtil.exist(filePath)){
            return;
        }
        // 如果文件存在就读取，然后得到一个byte数组
        byte[] bytes = FileUtil.readBytes(filePath);
        ServletOutputStream outputStream = response.getOutputStream(); // 字节流
        outputStream.write(bytes); // 数据是一个字节数组，也就是文件的字节流数组
        outputStream.flush(); // 刷新
        outputStream.close(); // 关闭文件流
    }

    @PostMapping("/editor/upload")
    public Dict editorUpload(@RequestParam MultipartFile file, @RequestParam String type) throws IOException {
        String originalFilename = file.getOriginalFilename(); // 获取文件的原始名称
        // 假设一个文件名为 aaa.png
        String mainName = FileUtil.mainName(originalFilename);  // 拿到一个不包含后缀的名称  aaa
        String extName = FileUtil.extName(originalFilename);// 拿到后缀名    png
        File parentFile = new File(ROOT_PATH); // 存储目录
        // 判断文件父级目录是否存在，如果不存在就创建父级目录  .exist() 存在
        if (!FileUtil.exist(ROOT_PATH)){
            FileUtil.mkdir(ROOT_PATH);  // 创建父级目录
        }
        File saveFile = new File(ROOT_PATH +"//" + originalFilename);  // 文件的存储路径 G:\Mr_zhu\One\systempower-bank\files\aaa.png
        // 如果当前上传的文件名已经存在了，，那么这个时候重命名一个文件名称 exists 存在
        if (saveFile.exists()){
            // 新文件名称 =  随机数 + _ + 原始名称 + .原始后缀
            // G:\Mr_zhu\One\systempower-bank\files\21345456aaa.png
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
            // File.separator 文件分隔符
            saveFile = new File(ROOT_PATH + File.separator+ originalFilename); // 组装存储路径
        }
        file.transferTo(saveFile); // 存储文件到本地的磁盘里面去
        String url = "http://"+ ip + ":" + port + "/file/download/" + originalFilename;
        if ("img".equals(type)){ // 上传图片
            // 返回文件的链接，这个链接就是文件的下载地址，这个下载地址就是我的后台提供出来的
            // 图片返回给前端的是数组，CollUtil.newArrayList包装一下
            return Dict.create().set("errno", 0).set("data", CollUtil.newArrayList(Dict.create().set("url",url)));
        } else if ("video".equals(type)) {
            // 图片返回给前端的是对象，不用包装
            return Dict.create().set("errno", 0).set("data", Dict.create().set("url",url));
        }
            return Dict.create().set("errno", 0);
    }
}
